home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / dhcp.nasl < prev    next >
Text File  |  2005-01-14  |  13KB  |  641 lines

  1. #
  2. # This script was written by Renaud Deraison <deraison@cvs.nessus.org>
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6.  
  7. if(description)
  8. {
  9.  script_id(10663);
  10.  script_version ("$Revision: 1.8 $");
  11.  
  12.  name["english"] = "DHCP server info gathering";
  13.  name["francais"] = "Obtention d'informations auprΦs de DHCP";
  14.  script_name(english:name["english"], francais:name["francais"]);
  15.  
  16.  desc["english"] = "
  17. This script contacts the remote DHCP server (if any) and
  18. attempts to retrieve information about the network layout.
  19.  
  20. Some DHCP server provide sensitive information such
  21. as the NIS domain name, or network layout information
  22. such as the list of the network www servers, and so on.
  23.  
  24. It does not demonstrate any vulnerability, but
  25. a local attacker may use DHCP to become intimately familiar
  26. with the network in no time.
  27.  
  28. Solution : Apply filtering to keep this information off the network
  29. Risk factor : Low";
  30.  
  31.  
  32.  
  33.  
  34.  script_description(english:desc["english"]);
  35.  
  36.  summary["english"] = "Chats with the remote DHCP server";
  37.  summary["francais"] = "Discute avec le serveur DHCP distant";
  38.  
  39.  script_summary(english:summary["english"], francais:summary["francais"]);
  40.  
  41.  script_category(ACT_GATHER_INFO);
  42.  
  43.  
  44.  script_copyright(english:"This script is Copyright (C) 2001 Renaud Deraison",
  45.         francais:"Ce script est Copyright (C) 2001 Renaud Deraison");
  46.  family["english"] = "General";
  47.  script_family(english:family["english"]);
  48.  exit(0);
  49. }
  50.  
  51. #
  52. # The script code starts here
  53. #
  54.  
  55.  
  56. if(islocalhost())exit(0);
  57.  
  58.  
  59. #-----------------------------------------------------#
  60. # Data extraction functions                           #
  61. #-----------------------------------------------------#
  62.  
  63. function extract_ip(data, index)
  64. {
  65.  ip_a = ord(data[index+2]);
  66.  ip_b = ord(data[index+3]);
  67.  ip_c = ord(data[index+4]);
  68.  ip_d = ord(data[index+5]);
  69.  return(string(ip_a, ".", ip_b, ".", ip_c, ".", ip_d));
  70. }
  71.  
  72.  
  73. function extract_multiple_ips(data, i)
  74. {
  75.  num_ips = ord(data[i+1]);
  76.  num_ips = num_ips / 4;
  77.  ret = "";
  78.  sp = "";
  79.  for(_i = 0; _i < num_ips ; _i = _i + 1)
  80.  {
  81.   off = _i * 4;
  82.   ret = string(ret, sp, extract_ip(data:data, index:i+off));
  83.   sp = " , ";
  84.  }
  85.  ret = string(ret, "\n");
  86.  return(ret);
  87. }
  88.  
  89. function extract_string(data, i)
  90. {
  91.  len = ord(data[i+1]);
  92.  ret ="";
  93.  for(_i = 0 ; _i < len ; _i = _i + 1)
  94.  {
  95.   ret = string(ret, data[i+2+_i]);
  96.  }
  97.  return(ret);
  98. }
  99.  
  100.  
  101. #----------------------------------------------------------#
  102. # Forgery                                                  #
  103. #----------------------------------------------------------#
  104.  
  105.  
  106. # Options we are interested in seeing.
  107.  
  108. opts = raw_string(1, 3, 4, 5, 6, 7, 8, 9, 
  109.           10, 11, 12, 14, 15, 16, 
  110.           17, 19, 20, 28, 40, 41, 
  111.           42, 44, 45, 48, 49, 54, 
  112.           64, 65, 66, 67, 68, 69, 
  113.           70, 71, 72, 73, 74, 75, 76);
  114.  
  115.  
  116. len = strlen(opts);
  117.  
  118.  
  119.  
  120. #
  121. # Note that we lie to the remote DHCP server by telling
  122. # it our ether address is FF:FF:FF:FF:FF. We do that 
  123. # so that we can get a reply from the server (nasl
  124. # does not know how to extract one's MAC address yet)
  125. #
  126. #
  127.  
  128. # (we choose a random request id)
  129. a = rand() % 255;
  130. b = rand() % 255;
  131. c = rand() % 255;
  132. d = rand() % 255;
  133.  
  134.  
  135. req = raw_string(
  136.     0x01, 0x01, 0x06, 0x00, a,    b,    c,    d,
  137.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  138.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  139.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
  140.     0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
  141.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  142.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  143.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  144.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  145.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  147.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  148.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  149.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  150.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  151.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  152.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  153.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  154.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  155.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  156.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  157.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  158.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  159.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  160.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  161.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  162.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  163.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  164.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  165.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82,
  166.     0x53, 0x63, 0x35, 0x01, 0x01, 0x37, len) + opts +
  167.     raw_string( 
  168.     0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  169.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
  170.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  171.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  172.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  173.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  174.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  175.     0x00);
  176.     
  177. len = strlen(req);
  178. addr = this_host();
  179. ip = forge_ip_packet(
  180.         ip_v    : 4,
  181.         ip_hl   : 5,
  182.         ip_len  : 20 + 8 + len,
  183.         ip_id   : 0x1234,
  184.         ip_p    : IPPROTO_UDP,
  185.         ip_tos  : 0,
  186.         ip_ttl  : 0x40,
  187.         ip_off  : 0,
  188.         ip_src  : addr);
  189.         
  190. udp = forge_udp_packet(
  191.         ip    : ip,
  192.         uh_sport: 68,
  193.         uh_dport: 67,
  194.         uh_ulen : 8 + len,
  195.         data    : req);
  196.         
  197.  
  198. #
  199. # Removing the 'src host' part of the pcap filter may be wise, 
  200. # as some DHCP server  will ask another agent to reply for them. But 
  201. # if we do that, we may encounter some problems when the same plugin is 
  202. # started against two hosts at the same time, and in addition to
  203. # this, we want to test this remote server, not another one.
  204. #        
  205. filter = string("udp and src host ", get_host_ip(), " and src port ", 67,
  206.         " and dst port ", 68);
  207.         
  208. rep = send_packet(udp, pcap_active:TRUE, pcap_filter:filter);        
  209. if(rep)
  210. {
  211. #
  212. # Woowoo. We received something back.
  213. #
  214. data = get_udp_element(element:"data", udp:rep);
  215. if(strlen(data) < 14)exit(0);
  216. my_ip = extract_ip(data:data, index:14);
  217. master_dhcp = extract_ip(data:data, index:18);
  218. report = string("Master DHCP server of this network : ", master_dhcp, "\n");
  219. report = string(report, "IP address the DHCP server would attribute us : ", my_ip, "\n");
  220.  
  221.  
  222. #
  223. # Now, we read the options we requested.
  224. #
  225. start = 240;
  226. end   = strlen(data);
  227. if(end < start)exit(0);
  228.  
  229. for(i = start; i < end ;)
  230. {
  231.  opt = ord(data[i]);
  232.  if(opt == 255){
  233.      i = end + 1;
  234.     }
  235.  else
  236.  {
  237.   #
  238.   # Netmask
  239.   #
  240.   if(opt == 1)
  241.   {
  242.    report = string(report, "netmask = ", extract_ip(data:data, index:i), "\n");
  243.   }
  244.  
  245.  
  246.   #
  247.   # Router
  248.   #
  249.   if(opt == 3)
  250.   {
  251.    report = string(report, "router = ", extract_multiple_ips(data:data, i:i));
  252.   }
  253.   
  254.   
  255.   #
  256.   # Time server(s)
  257.   #
  258.   if(opt == 4)
  259.   {
  260.    report = string(report, "time server(s) = ", extract_multiple_ips(data:data, i:i));
  261.   }
  262.   
  263.  
  264.   #
  265.   # NS
  266.   #
  267.   if(opt == 5)
  268.   {
  269.    report = string(report, "name server(s) = ", extract_multiple_ips(data:data, i:i));
  270.   }
  271.   
  272.   
  273.   #
  274.   # DNS
  275.   #
  276.   if(opt == 6)
  277.   {
  278.   report = string(report, "domain name server(s) = ", extract_multiple_ips(data:data, i:i));
  279.   }
  280.   
  281.   #
  282.   # Log server(s)
  283.   #
  284.   if(opt == 7)
  285.   {
  286.    report  = string(report, "log server(s) = ", extract_multiple_ips(data:data, i:i));
  287.   }
  288.  
  289.   #
  290.   # Cookie server(s)
  291.   #
  292.   if(opt == 8)
  293.   {
  294.    report = string(report, "cookie server(s) = ", extract_multiple_ips(data:data, i:i));
  295.   }
  296.   
  297.   #
  298.   # Print server(s)
  299.   #
  300.   if(opt == 9)
  301.   {
  302.    report = string(report, "print server(s) = ", extract_multiple_ips(data:data, i:i));
  303.   }
  304.   
  305.   #
  306.   # Impress server(s)
  307.   #
  308.   if(opt == 10)
  309.   {
  310.    report = string(report, "impress server(s) = ", extract_multiple_ips(data:data, i:i));
  311.   }
  312.   
  313.   
  314.   #
  315.   # Resource location server(s)
  316.   #
  317.   if(opt == 11)
  318.   {
  319.    report = string(report, "resource location server(s) = ", extract_multiple_ips(data:data, i:i));
  320.   }
  321.   
  322.   #
  323.   # Host name
  324.   #
  325.   if(opt == 12)
  326.   {
  327.    len = ord(data[i+1]);
  328.    name = "";
  329.    for(k = 0; k < len ; k = k + 1)
  330.    {
  331.     name = string(name, data[i+2+k]);
  332.    }
  333.    report = string(report, "host name = ", name, "\n");
  334.   }
  335.   
  336.   
  337.   #
  338.   # dump file
  339.   #
  340.   if(opt == 14)
  341.   {
  342.    len = ord(data[i+1]);
  343.    name = "";
  344.    for(k = 0; k < len ; k = k + 1)
  345.    {
  346.     name = string(name, data[i+2+k]);
  347.    }
  348.    report = string(report, "dump file name = ", name, "\n");
  349.   }
  350.   
  351.   
  352.   #
  353.   # Domain name
  354.   #
  355.   if(opt == 15)
  356.   {
  357.    len = ord(data[i+1]);
  358.    domain = "";
  359.    for(k = 0; k < len ; k = k + 1)
  360.    {
  361.     domain = string(domain, data[i+2+k]);
  362.    }
  363.    report = string(report, "domain name = ", domain, "\n");
  364.   }
  365.   
  366.  
  367.   #
  368.   # swap server
  369.   #
  370.   if(opt == 16)
  371.   {
  372.    report = string(report, "swap server = ", extract_ip(data:data, index:i));
  373.   }
  374.   
  375.   
  376.   #
  377.   # Root path
  378.   #
  379.   if(opt == 17)
  380.   {
  381.    len = ord(data[i+1]);
  382.    name = "";
  383.    for(k = 0; k < len ; k = k + 1)
  384.    {
  385.     name = string(name, data[i+2+k]);
  386.    }
  387.    report = string(report, "root path  = ", name, "\n");
  388.   }
  389.   
  390.   #
  391.   # IP forwarding enabled ?
  392.   #
  393.   if(opt == 19)
  394.   {
  395.    if(ord(data[i+2]))report = string(report, 
  396.    "The remote DHCP server wants its clients to foward IP packets\n");
  397.   }
  398.   
  399.   if(opt == 20)
  400.   {
  401.    if(ord(data[i+2]))report = string(report,
  402.   "The remote DHCP server wants its clients to forward source routed packets\n");
  403.   }
  404.   
  405.   #
  406.   # Broadcast
  407.   #
  408.   if(opt == 28)
  409.   {
  410.   report = string(report, "broadcast address = ", extract_ip(data:data, index:i), "\n");
  411.   }
  412.   
  413.   #
  414.   # NIS domain name (woowoo ;)
  415.   #
  416.   if(opt == 40)
  417.   {
  418.    len = ord(data[i+1]);
  419.    domain = "";
  420.    for(k = 0; k < len ; k = k + 1)
  421.    {
  422.     domain = string(domain, data[i+2+k]);
  423.    }
  424.    report = string(report, "NIS domain name = ", domain, "\n");
  425.    old_nis = get_kb_item("RPC/NIS/domain");
  426.    if(!old_nis)set_kb_item(name:"RPC/NIS/domain", value:domain);
  427.   }
  428.   
  429.   #
  430.   # NIS server(s)
  431.   #
  432.   if(opt == 41)
  433.   {
  434.   report = string(report, "NIS server(s)  = ", extract_multiple_ips(data:data,   i:i));
  435.   }
  436.   
  437.   #
  438.   # NTP server(s)s
  439.   #
  440.   if(opt == 42)
  441.   {
  442.   report = string(report, "NTP server(s)  = ", extract_multiple_ips(data:data, 
  443.    i:i));
  444.   }
  445.   
  446.   
  447.   #
  448.   # NetBios DNS
  449.   #
  450.   if(opt == 44)
  451.   {
  452.   report = string(report, "Netbios Name server(s) = ", extract_multiple_ips(data:data,   i:i));
  453.   }
  454.  
  455.   #
  456.   # NetBios DNS
  457.   #
  458.   if(opt == 45)
  459.   {
  460.   report = string(report, "Netbios Datagram Distribution server(s) = ",
  461.   extract_multiple_ips(data:data, i:i));
  462.   }
  463.   
  464.   #
  465.   # XWindow fonts server(s)
  466.   #
  467.   if(opt == 48)
  468.   {
  469.   report = string(report, "XWindow fonts server(s) = ",
  470.   extract_multiple_ips(data:data, i:i));
  471.   }
  472.   
  473.   #
  474.   # XWindow display
  475.   #
  476.   if(opt == 49)
  477.   {
  478.   report = string(report, "XWindow Display server(s) = ",
  479.   extract_multiple_ips(data:data, i:i));
  480.   }
  481.   
  482.   #
  483.   # DHCP server(s) identifier
  484.   #
  485.   if(opt == 54)
  486.   {
  487.   report = string(report, "DHCP server(s) identifier = ",
  488.   extract_multiple_ips(data:data, i:i));
  489.   }
  490.   
  491.   
  492.   #
  493.   # NIS+ domain name
  494.   #
  495.   if(opt == 64)
  496.   {
  497.    report = string(report, "NIS+ domain name = ",
  498.        extract_string(data:data, i:i), "\n");
  499.   }
  500.   
  501.   
  502.   
  503.   #
  504.   # NIS+ server(s)s
  505.   #
  506.   if(opt == 65)
  507.   {
  508.    report = string(report, "NIS+ server(s) = ",
  509.        extract_multiple_ips(data:data, i:i));
  510.   }
  511.   
  512.   
  513.   
  514.   #
  515.   # Boot server(s) host name
  516.   #
  517.   if(opt == 66)
  518.   {
  519.    report = string(report, "Bootserver(s) host name = ",
  520.        extract_string(data:data, i:i), "\n");
  521.   }
  522.   
  523.   
  524.   #
  525.   # Bootfile name
  526.   #
  527.   if(opt == 67)
  528.   {
  529.    report = string(report, "Bootfile name = ",
  530.        extract_string(data:data, i:i), "\n");
  531.   }
  532.   
  533.   
  534.   
  535.   
  536.   #
  537.   # Mobile IP home agents
  538.   #
  539.   if(opt == 68)
  540.   {
  541.    report = string(report, "Mobile IP home agents = ",
  542.        extract_multiple_ips(data:data, i:i));
  543.   }
  544.   
  545.   
  546.   
  547.   #
  548.   # SMTP server(s)s
  549.   #
  550.   if(opt == 69)
  551.   {
  552.    report = string(report, "SMTP server(s)s = ",
  553.        extract_multiple_ips(data:data, i:i));
  554.   }
  555.   
  556.   
  557.   #
  558.   # POP3 server(s)s
  559.   #
  560.   if(opt == 70)
  561.   {
  562.    report = string(report, "POP3 server(s)s = ",
  563.        extract_multiple_ips(data:data, i:i));
  564.   }
  565.   
  566.   
  567.   
  568.   #
  569.   # NNTP server(s)s
  570.   #
  571.   if(opt == 71)
  572.   {
  573.    report = string(report, "NNTP server(s) = ",
  574.        extract_multiple_ips(data:data, i:i));
  575.   }
  576.   
  577.   
  578.   
  579.   #
  580.   # WWW server(s)s
  581.   #
  582.   if(opt == 72)
  583.   {
  584.    report = string(report, "WWW server(s) = ",
  585.        extract_multiple_ips(data:data, i:i));
  586.   }
  587.   
  588.   
  589.   #
  590.   # Finger server(s)s
  591.   #
  592.   if(opt == 73)
  593.   {
  594.    report = string(report, "Finger server(s) = ",
  595.        extract_multiple_ips(data:data, i:i));
  596.   }
  597.   
  598.   
  599.   #
  600.   # IRC server(s)s
  601.   #
  602.   if(opt == 74)
  603.   {
  604.    report = string(report, "IRC server(s)s = ",
  605.        extract_multiple_ips(data:data, i:i));
  606.   }
  607.   
  608.   
  609.   
  610.   #
  611.   # Street Talk server(s)s
  612.   #
  613.   if(opt == 75)
  614.   {
  615.    report = string(report, "StreetTalk server(s)s = ",
  616.        extract_multiple_ips(data:data, i:i));
  617.   }
  618.   
  619.   
  620.   
  621.   #
  622.   # Street Talk Directory Assistance server(s)s
  623.   #
  624.   if(opt == 76)
  625.   {
  626.    report = string(report, "StreetTalk Directory Assistance (STDA) server(s) = ",
  627.        extract_multiple_ips(data:data, i:i));
  628.   }
  629.    i = i + ord(data[i+1]) + 2;
  630.   }
  631.   
  632.  }
  633.  report = string("Here is the information we could gather from the remote DHCP\n",
  634. "server. This allows an attacker on your local network to gain\n",
  635. "information about it easily :\n\n", report, "\n\n",
  636. "Solution : remove the options that are not in use in your DHCP server\n",
  637. "Risk factor : Low\n");
  638.  security_note(port:67, protocol:"udp", data:report);
  639. }
  640.  
  641.